package priv.pattern.factory;

// 产品基类
abstract class Product {
    private final String name;

    public Product(String name) {
        this.name = name;
    }
}
// 产品A
class ConcreteProductA extends Product {
    public ConcreteProductA() {
        super("Product A");
    }
}
// 产品B
class ConcreteProductB extends Product {
    public ConcreteProductB() {
        super("Product B");
    }
}

// 工厂接口
interface Factory<T extends Product> {
    T createProduct();
}

// 生产A的工厂
class ConcreteFactoryA implements Factory<ConcreteProductA> {
    @Override
    public ConcreteProductA createProduct() {
        return new ConcreteProductA();
    }
}

// 生产B的工厂
class ConcreteFactoryB implements Factory<ConcreteProductB> {
    @Override
    public ConcreteProductB createProduct() {
        return new ConcreteProductB();
    }
}

/*
 工厂屏蔽了创建对象的细节，我们只需要关注如何去使用即可
 利用泛型，通过子类建立多个分工厂，实现不同产品的创建
 即使有新的产品加入，也只需要增加一个分工厂，不需要修改原有的工厂，满足开闭原则
 */